package sql.dml.selecao.tabela.juncao;

import sql.dml.selecao.coluna.ListaOQue;
import sql.dml.selecao.coluna.Oque;
import sql.dml.selecao.filtro.FiltroSQl;
import sql.dml.selecao.filtro.ListaFiltro;
import sql.dml.selecao.tabela.Onde;
import sql.dml.selecao.tabela.TabelaSelecao;

public class TabelaSelecaoJoin extends Onde {
	ListaOQue colunas = null;

	TipoJuncaoPesquisa juncao = TipoJuncaoPesquisa.INNER;

	String alias = null;

	TabelaSelecao primeira = null;

	TabelaSelecao segunda = null;

	ListaFiltro filtro = null;

	public TabelaSelecaoJoin(TabelaSelecao tabela, TabelaSelecao tabela2,
			TipoJuncaoPesquisa tipo, String alias, FiltroSQl... filtro) {
		this(tabela, tabela2, tipo, filtro);
		this.alias = alias;
	}

	public TabelaSelecaoJoin(TabelaSelecao tabela, TabelaSelecao tabela2,
			TipoJuncaoPesquisa tipo, FiltroSQl... comparacao) {
		primeira = tabela;
		this.juncao = tipo;
		filtro = new ListaFiltro();
		for (FiltroSQl ql : comparacao)
			filtro.add(ql);
		segunda = tabela2;

	}

	public String codigoSQL() {
		String filtrarPor = filtro == null ? "true" : filtro.codigoSQL();
		String query = primeira.codigoSQL() + SPACE + juncao + SPACE + JOIN
				+ SPACE + segunda.codigoSQL() + SPACE + ON + SPACE + filtrarPor;
		return alias == null ? query : montarAlias(query);
	}

	private String montarAlias(String query) {
		return BEGINPARENTES + query + ENDPARENTES + AS + SPACE + alias;
	}

	public String getAlias() throws Exception {
		if (alias == null)
			throw new Exception(primeira.getAlias() + " " + segunda.getAlias());
		return alias;
	}

	public ListaOQue getColunas() {
		return colunas == null ? montarColunas() : colunas;
	}

	private ListaOQue montarColunas() {
		colunas = new ListaOQue();
		for (Oque oque : primeira.getColunas())
			colunas.add(oque);
		for (Oque oque : segunda.getColunas())
			colunas.add(oque);
		return colunas;
	}
}
